package com.king.designpatterns.hybriddesignpattern.hybriddesignpattern.chainofcommandandresponsibility;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

/**
 * 命令链模式
 *
 * 不同组合的ls命令调用不同的业务逻辑进行处理。为提高扩展性，ls命令族内的运算对外是封闭的，减小外界访问ls命令族的可能性；
 * 使用责任链模式针对一个命令族进行分析直至结束。只要把一个参数传递到一个链首，就可以立刻获得一个结果，
 * 中间是如何传递、由哪个逻辑解析的都不是外界关心的。
 *
 * ■ 责任链模式：负责对命令的参数进行解析，且所有的扩展都是增加链数量和节点，不涉及原有的代码变更。
 * ■ 命令模式：负责命令的分发，将适当的命令分发到指定的链上。
 * ■ 模板方法模式：Command类、CommandName类都采用模板方法模式。
 * ■ 迭代器模式：使用for循环。
 *
 * 说明：
 *      ■ CommandName抽象类：是所有命令的父类，是责任链模式的handler类，用于负责命令链表控制。
 *      ■ AbstractLS抽象类：是ls命令族的抽象类，用于标示并定义ls命令的独特个性，其实现类都实现ls命令，只是命令的选项不同。
 *      ■ Context环境类：负责建立一条命令的链表，并返回首节点供高层模块调用，属于典型的责任链模式。
 *      ■ ClassUtils：该类是一个工具类，主要职责是根据接口或父类查找到所有对应的子类。
 *      ■ CommandVO：是命令的值对象，将一个命令解析为命令名、选项、操作数，例如，“ls -l/usr”命令。
 *      ■ CommandEnum：是枚举类型，主要的命令配置文件。
 *
 * @author king
 * @date 2021-06-11 15:44
 */
public class Client {
    public static void main(String[] args) {
        Invoker invoker = new Invoker();
        while(true) {
            // unix 下的默认提示符
            System.out.print("#");
            // 捕获输出
            try {
                String input = (new BufferedReader(new InputStreamReader(System.in))).readLine();
                if ("quit".equals(input) || "exit".equals(input)){
                    return;
                }
                System.out.println(invoker.exec(input));
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
